/*******************************************************************************
 *	                           bsp cpu.c
 *******************************************************************************/
#include "bsp.h"
#include "pincfg.h"
#include "swiic.h"

/*******************************************************************************
 * @brief  端口位定义
 *******************************************************************************/
#define SDA_OUT1() sda.en()
#define SDA_OUT0() sda.dis()
#define SDA_ST() sda.in_st()
#define SCL_OUT1() scl.en()
#define SCL_OUT0() scl.dis()

#define IIC_SCL_OUT() scl.dir_out_pp()
#define IIC_SDA_OUT() sda.dir_out_pp()
#define IIC_SDA_IN() sda.dir_in_up()

/*******************************************************************************
 * @brief  硬件管脚配置
 *******************************************************************************/
static void iic_sda_out_high(void)
{
	SDA_OUT1();
}

static void iic_sda_out_low(void)
{
	SDA_OUT0();
}

static void iic_scl_out_high(void)
{
	SCL_OUT1();
}

static void iic_scl_out_low(void)
{
	SCL_OUT0();
}

static void iic_scl_out_mode(void)
{
	IIC_SCL_OUT();
}

static void iic_sda_out_mode(void)
{
	IIC_SDA_OUT();
}

static void iic_sda_in_mode(void)
{
	IIC_SDA_IN();
}

static uint8_t iic_sda_st_get(void)
{
	return SDA_ST();
}

swiic_cfg_type bsp_sw_iic = {
	iic_sda_out_high,
	iic_sda_out_low,
	iic_scl_out_high,
	iic_scl_out_low,
	iic_scl_out_mode,
	iic_sda_out_mode,
	iic_sda_in_mode,
	iic_sda_st_get,
};

/*******************************************************************************
 * iic fun
 *******************************************************************************/
void bsp_iic_send_only(char *dat, char len)
{
	sw_iic_start(&bsp_sw_iic);

	while (len--)
	{
		sw_iic_send_byte(&bsp_sw_iic, *dat++);
	}
	sw_iic_stop(&bsp_sw_iic);
}

/*******************************************************************************
 * @brief  操作接口
 *******************************************************************************/
static void swiic_start(void)
{
	sw_hiic_start(&bsp_sw_iic);
}

static void swiic_stop(void)
{
	sw_hiic_stop(&bsp_sw_iic);
}

static uint8_t swiic_snd_byte(uint8_t dat)
{
	return sw_hiic_send_byte(&bsp_sw_iic, dat);
}

static uint8_t swiic_rcv_byte(void)
{
	return sw_hiic_rcv_byte(&bsp_sw_iic);
}

static void swiic_ack_send(uint8_t ack)
{
	sw_hiic_ack_send(&bsp_sw_iic, ack);
}

iic_obj_fun_ref(sw_iic_obj);
const iic_obj_type sw_iic_obj = {
	swiic_start,
	swiic_stop,
	swiic_snd_byte,
	swiic_rcv_byte,
	swiic_ack_send,
	iic_obj_fun_name(sw_iic_obj),
};
iic_obj_fun_make(sw_iic_obj);
